package br.com.fogas.impressora;

import br.com.fogas.database.entidade.NotaFiscal;
import br.com.fogas.modelo.Configuracao;
import br.com.fogas.utils.FogasUtility;

public class ImpressaoBuilder {
	
	private ImpressoraMPT_Builder impressoraBuilder;
	private ImpressaoNotaBuilder notaBuilder;
	private ImpressaoBoletoBuilder boletoBuilder;
	
	public ImpressaoBuilder() throws ImpressoraMPTException {
		this.impressoraBuilder = new ImpressoraMPT_Builder();
		this.notaBuilder = new ImpressaoNotaBuilder(impressoraBuilder);
		this.boletoBuilder = new ImpressaoBoletoBuilder(impressoraBuilder);
	}
	
	public ImpressaoBuilder imprimirBoleto(NotaFiscal notaFiscal, Configuracao configuracao) {
		boletoBuilder = new ImpressaoBoletoBuilder(impressoraBuilder)
		.nomeBanco("Bradesco")
        .codBanco("237-2")
        .localPagamento("Banco Bradesco S.A.")
        .agenciaCodigoCedente("2368-P / 5124-1")
        .nossoNumero(notaFiscal.getTx_nosso_numero())
        .localOpcionalPagamento("Pagavel preferencialmente em qualquer agencia Bradesco.")
        .vencimento(notaFiscal.getDt_vencimento())
        .carteira("09")
        .cedente("SOCIEDADE FOGAS LTDA")
        .dataDocumento(notaFiscal.getDt_nota())
        .especieMoeda("R$")
        .dataProcessameto(notaFiscal.getDt_nota())
        .numeroDocumento(notaFiscal)
        .valor(notaFiscal.getVl_valor_nota().doubleValue())
        .valorDocumento(notaFiscal.getVl_valor_nota().doubleValue());
		
		double jurosAoAnoFogas = Double.parseDouble(configuracao.getAppDados().getJuros());
        double mora = FogasUtility.fogasBoleto.valorMoraBoleto(notaFiscal.getVl_valor_nota().doubleValue(), jurosAoAnoFogas);
        
        if(notaFiscal.getVl_desconto_boleto().doubleValue() > 0) {
        	double desconto = FogasUtility.fogasBoleto.valorDescontoBoleto(notaFiscal.getVl_desconto_boleto().doubleValue());
        	boletoBuilder
        	.instrucaoCedente("Ate vencimento, conceder desconto de "+FogasUtility.string.currencyFormat(desconto)+".")
        	.instrucaoCedente("Sab/Dom/Feriados - Desconto vale ate o primeiro dia util.")
        	.instrucaoCedente("Apos vencimento pagar somente no Bradesco.")
        	.instrucaoCedente("Juros de mora ao dia de "+FogasUtility.string.currencyFormat(mora)+".")
        	.instrucaoCedente("Protestar com 30 dias do vencimento.")
        	.instrucaoCedente("Multa de 2% apos o decimo sexto dia do vencimento.")
        	.instrucaoCedente("");
        } else {
        	boletoBuilder
        	.instrucaoCedente("Apos vencimento pagar somente no Bradesco.")
        	.instrucaoCedente("Juros de mora ao dia de "+FogasUtility.string.currencyFormat(mora)+".")
        	.instrucaoCedente("Protestar com 30 dias do vencimento.")
        	.instrucaoCedente("Multa de 2% apos o decimo sexto dia do vencimento.")
        	.instrucaoCedente("")
        	.instrucaoCedente("")
        	.instrucaoCedente("");
        }
        
        boletoBuilder
        .linhaDigitavel(notaFiscal.getTx_cod_boleto())
        .sacadoNome(notaFiscal.getTx_cod_cliente())
        .sacadoEndereco(notaFiscal.getTx_cod_cliente())
        .sacadoCep(notaFiscal.getTx_cod_cliente())
        .sacadoCidade(notaFiscal.getTx_cod_cliente())
        .sacadoUF(notaFiscal.getTx_cod_cliente())	           
        .sacadoCnpj(notaFiscal.getTx_cod_cliente())
        .imprimir();
        //.especieDoc("")
        //.aceite("")
        //.usoDoBanco("")
        //.cip("")
        //.desconto("")
        //.deducoes("")
        //.multa("")
        //.acrescimos("")
        //.valorCobrado("");
        return this;
	}
	
	public ImpressaoBuilder imprimirNota(NotaFiscal notaFiscal, Configuracao configuracao, int via) throws ImpressoraMPTException {
		notaBuilder
		.naturezaOperacao("VND.MER.ADQ.REC.TER.MER.SUJ.SUB.TRI.CON.SB")
		.cfop("5.405")
		.nfNumero(notaFiscal.getTx_nfnum())
		.nfSerie(notaFiscal.getTx_serie())
		.via(via)
		.emitidaContigencia(notaFiscal.isCs_contigencia())
		.chaveAcesso(notaFiscal.getTx_chave_acesso())
		.protocoloAutorizacao(notaFiscal.getTx_protocolo())
		.emitente(configuracao.getFogasDados())
		.emissaoDataHora(notaFiscal.getDt_nota(), notaFiscal.getDt_hora())
		.destinatarioNome(notaFiscal.getTx_cod_cliente())
		.destinatarioCnpj(notaFiscal.getTx_cod_cliente().getTx_cnpj())
		.produtos(notaFiscal.getNotaItems())
		.descontos(notaFiscal)
		.valorBaseIcms(notaFiscal.getVl_base_icms().doubleValue())
		.valorIcms(notaFiscal.getVl_icms().doubleValue())
		.valorTotalProdutos(notaFiscal.getVl_valor_total_produtos().doubleValue())
		.valorDescontos(notaFiscal.getVl_descontos().doubleValue())
		.valorOutrasDespesas(0.00)
		.quantidade(notaFiscal.getVl_quantidades().doubleValue())
		.pesoBruto(notaFiscal.getVl_peso_bruto().doubleValue())
		.pesoLiquido(notaFiscal.getVl_peso_liquido().doubleValue())
		.valorTotalNota(notaFiscal.getVl_valor_nota().doubleValue())
		.imprimir();
		return this;
	}
	
	public ImpressoraMPT_Builder getImpressoraBuilder() {
		return impressoraBuilder;
	}
}